package com.herench.bunch.clinic.convert;

import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.v24.datatype.CE;
import ca.uhn.hl7v2.model.v24.datatype.XCN;
import ca.uhn.hl7v2.model.v24.group.*;
import ca.uhn.hl7v2.model.v24.message.*;
import ca.uhn.hl7v2.model.v24.segment.*;
import ca.uhn.hl7v2.parser.PipeParser;
import com.herench.bunch.clinic.support.ProxyMsgTemplate;
import com.herench.bunch.commons.utils.IdGenerator;
import org.dom4j.Document;
import org.junit.Test;
import org.springframework.util.Assert;

import java.io.IOException;
import java.util.*;

public class testWS {

    /**
     * 检验单计费入报文
     *
     */
    @Test
    public void tesWSjydR() throws IOException, HL7Exception {
//        QRY_Q01 qry = new QRY_Q01();
//        qry.initQuickstart("QRY_Q01", "Q01", "A");
//        MSH msh = qry.getMSH();
//        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("10250");
//        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("SSM");
//        msh.getMsh7_DateTimeOfMessage().getTs1_TimeOfAnEvent().setValue(new Date());
//        msh.getMsh10_MessageControlID().setValue(IdGenerator.getUUID());
//        QRD qrd = qry.getQRD();
//
//        int index = 0;
//        XCN ce = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce.getXcn16_NameContext().getCe1_Identifier().setValue("test_no");
//        ce.getXcn16_NameContext().getCe2_Text().setValue("4246178257441441008");
//
//        XCN ce1 = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce1.getXcn16_NameContext().getCe1_Identifier().setValue("patient_id");
//        ce1.getXcn16_NameContext().getCe2_Text().setValue("000185|2018-08-24|A");
//
//        XCN ce2 = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce2.getXcn16_NameContext().getCe1_Identifier().setValue("visit_id");
//        ce2.getXcn16_NameContext().getCe2_Text().setValue("123");
//
//        XCN ce3 = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce3.getXcn16_NameContext().getCe1_Identifier().setValue("baby_no");
//        ce3.getXcn16_NameContext().getCe2_Text().setValue("010201");
//
//        XCN ce4 = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce4.getXcn16_NameContext().getCe1_Identifier().setValue("operator_no");
//        ce4.getXcn16_NameContext().getCe2_Text().setValue("A");
//
//        XCN ce5 = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce5.getXcn16_NameContext().getCe1_Identifier().setValue("item_flag");
//        ce5.getXcn16_NameContext().getCe2_Text().setValue("2018-08-24");
//
//        XCN ce6 = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce6.getXcn16_NameContext().getCe1_Identifier().setValue("item_code");
//        ce6.getXcn16_NameContext().getCe2_Text().setValue("0");
//
//        XCN ce7 = qrd.insertQrd8_WhoSubjectFilter(index++);
//        ce7.getXcn16_NameContext().getCe1_Identifier().setValue("item_code");
//        ce7.getXcn16_NameContext().getCe2_Text().setValue("0");
//
//
//        System.out.println(qry);
//
//
//        HapiContext hapiContext =new DefaultHapiContext();
//        PipeParser pipeParser =hapiContext.getPipeParser();
//        String res=pipeParser.encode(qry);
//        QRY_Q01 qry_q01= (QRY_Q01) pipeParser.parse(res);
//
//        QRD qrd1=qry_q01.getQRD();
//
//        int i=qrd1.getQrd8_WhoSubjectFilterReps();
//        for(int j=0;j<i;j++) {
//            CE ce8 = qrd1.getQrd9_WhatSubjectFilter(j);
//            ce8.getCe1_Identifier().getValue();
//            ce8.getCe2_Text().getValue();
//
//            System.out.println(ce8);


//        }

        //检验申请单计费/退费   接收消息字段

        QRY_Q01 qry = new QRY_Q01();
        qry.initQuickstart("QRY_Q01", "Q01", "A");
        MSH msh = qry.getMSH();
        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("300040");
        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("SSM");
        msh.getMsh7_DateTimeOfMessage().getTs1_TimeOfAnEvent().setValue(new Date());
        msh.getMsh10_MessageControlID().setValue(IdGenerator.getUUID());
        QRD qrd = qry.getQRD();

        int index = 0;
        XCN ce0 = qrd.insertQrd8_WhoSubjectFilter(index++);
        ce0.getXcn16_NameContext().getCe1_Identifier().setValue("MTestNo");
        ce0.getXcn16_NameContext().getCe2_Text().setValue("4246178257441441008");

        XCN ce1 = qrd.insertQrd8_WhoSubjectFilter(index++);
        ce1.getXcn16_NameContext().getCe1_Identifier().setValue("MPId");
        ce1.getXcn16_NameContext().getCe2_Text().setValue("001");

        XCN ce2 = qrd.insertQrd8_WhoSubjectFilter(index++);
        ce2.getXcn16_NameContext().getCe1_Identifier().setValue("MVisitId");
        ce2.getXcn16_NameContext().getCe2_Text().setValue("1");

        XCN ce3 = qrd.insertQrd8_WhoSubjectFilter(index++);
        ce3.getXcn16_NameContext().getCe1_Identifier().setValue("MBabyNo");
        ce3.getXcn16_NameContext().getCe2_Text().setValue("1");

        XCN ce4 = qrd.insertQrd8_WhoSubjectFilter(index++);
        ce4.getXcn16_NameContext().getCe1_Identifier().setValue("MOerator");
        ce4.getXcn16_NameContext().getCe2_Text().setValue("1");

        XCN ce5 = qrd.insertQrd8_WhoSubjectFilter(index++);
        ce5.getXcn16_NameContext().getCe1_Identifier().setValue("MItemFlag");
        ce5.getXcn16_NameContext().getCe2_Text().setValue("A");

        XCN ce6= qrd.insertQrd8_WhoSubjectFilter(index++);
        ce6.getXcn16_NameContext().getCe1_Identifier().setValue("MItemNo");
        ce6.getXcn16_NameContext().getCe2_Text().setValue("1");

        XCN ce7 = qrd.insertQrd8_WhoSubjectFilter(index++);
        ce7.getXcn16_NameContext().getCe1_Identifier().setValue("MItemCode");
        ce7.getXcn16_NameContext().getCe2_Text().setValue("1");

        System.out.println( qry);


    }
    /**
     * 检验单计费出报文
     *
     */
    @Test
    public void tesWSjydC()throws Exception{
        String message = "<?xml version=\"1.0\"?>\n" +
                "<Request>\n" +
                "\t<TradeCode>10250</TradeCode>\n" +
                "\t<TransNO>APPa7f2373a118e479b93ce514fdb0ebd1b</TransNO>\n" +
                "\t<TerminalCode>APP</TerminalCode>\n" +
                "\t<MachineIP>0.0.0.0</MachineIP>\n" +
                "\t<result>0</result>\n" +
                "\t<result_text>没有</result_text>\n" +
                "\t<price>100.00</price>\n" +
                "\t<charges>50.00</charges>\n" +
                "</Request>";
        Assert.notNull(message,"message 为空.");
        Document doc = ProxyMsgTemplate.getOutMsgTpl(message);
        QBP_Q13 qbp_q13 = new QBP_Q13();
        qbp_q13.initQuickstart("QBP_Q13", "Q13", "P");
        MSH msh = qbp_q13.getMSH();
        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("HIS");
        msh.getMsh5_ReceivingApplication().getHd1_NamespaceID().setValue("LIS");
        msh.getMsh7_DateTimeOfMessage().getTs1_TimeOfAnEvent().setValue(new Date());
        msh.getMsh10_MessageControlID().setValue(UUID.randomUUID().toString().replace("-",""));
        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("10250");
        msh.getMsh11_ProcessingID().getPt2_ProcessingMode().setValue("P");

        int index = 0;
        RCP rcp = qbp_q13.getRCP();
       rcp.getRcp6_SortByField(0).getSrt1_SortByField().setValue("result="+doc.getRootElement().elementTextTrim("result"));
       rcp.getRcp6_SortByField(1).getSrt1_SortByField().setValue("result_text="+doc.getRootElement().elementTextTrim("result_text"));
       rcp.getRcp6_SortByField(2).getSrt1_SortByField().setValue("price="+doc.getRootElement().elementTextTrim("price"));
       rcp.getRcp6_SortByField(3).getSrt1_SortByField().setValue("charges="+doc.getRootElement().elementTextTrim("charges"));



        System.out.println(qbp_q13);

        HapiContext hapiContext =new DefaultHapiContext();
        PipeParser pipeParser =hapiContext.getPipeParser();
        String res=pipeParser.encode(qbp_q13);
        QBP_Q13 qbp_q131 = (QBP_Q13) pipeParser.parse(res);
       // RTB_K13 rtb_k13= (RTB_K13) pipeParser.parse(res);
        RCP rcp1 =qbp_q131.getRCP();
        //RTB_K13_ROW_DEFINITION rtb_k13_row_definition=rtb_k13.getROW_DEFINITION();
       // RDT rdt = rtb_k13_row_definition.getRDT();
        rcp1.getRcp6_SortByField(0).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(1).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(2).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(3).getSrt1_SortByField().getValue();

        System.out.println(qbp_q131);
    }

    /**
     * 检验单状态更新入报文
     */
    @Test
    public void testZtR() throws Exception{
        QBP_Q13 qbp = new QBP_Q13();
        qbp.initQuickstart("QBP_Q13", "QBP_Q13", "P");
        MSH msh = qbp.getMSH();
        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("SSM");
        msh.getMsh10_MessageControlID().setValue(IdGenerator.getUUID());
        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("10260");
        RCP rcp = qbp.getRCP();
        //QPD qpd = qbp.getQPD();
        CE ce = new CE(qbp);

        ce.getCe2_Text();

        rcp.getRcp6_SortByField(0).getSrt1_SortByField().setValue("10011");
        rcp.getRcp6_SortByField(1).getSrt1_SortByField().setValue("1");
        rcp.getRcp6_SortByField(2).getSrt1_SortByField().setValue("xiao");
        rcp.getRcp6_SortByField(3).getSrt1_SortByField().setValue("xiao");

        System.out.println(qbp);


        HapiContext hapiContext =new DefaultHapiContext();
        PipeParser pipeParser =hapiContext.getPipeParser();
        String res=pipeParser.encode(qbp);
        QBP_Q13 qbp_q131 = (QBP_Q13) pipeParser.parse(res);

        RCP rcp1 =qbp_q131.getRCP();
        rcp1.getRcp6_SortByField(0).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(1).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(2).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(3).getSrt1_SortByField().getValue();

        System.out.println(qbp_q131);
    }

    /**
     * 检验单状态更新出报文
     */
    @Test
    public void testZtC() throws Exception{
        String message = "<?xml version=\"1.0\"?>\n" +
                "<Request>\n" +
                "\t<TradeCode>10260</TradeCode>\n" +
                "\t<TransNO>APPa7f2373a118e479b93ce514fdb0ebd1b</TransNO>\n" +
                "\t<TerminalCode>APP</TerminalCode>\n" +
                "\t<MachineIP>0.0.0.0</MachineIP>\n" +
                "\t<result>0</result>\n" +
                "\t<result_text>正常</result_text>\n" +
                "</Request>";
        Assert.notNull(message,"message 为空.");
        Document doc = ProxyMsgTemplate.getOutMsgTpl(message);
        DSR_Q01 dsr = new DSR_Q01();

        dsr.initQuickstart("DSR_Q01", "Q01", "P");
        MSH msh = dsr.getMSH();
        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("HIS");
        msh.getMsh5_ReceivingApplication().getHd1_NamespaceID().setValue("LIS");
        msh.getMsh7_DateTimeOfMessage().getTs1_TimeOfAnEvent().setValue(new Date());
        msh.getMsh10_MessageControlID().setValue(UUID.randomUUID().toString().replace("-",""));
        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("10260");
        msh.getMsh11_ProcessingID().getPt2_ProcessingMode().setValue("P");

        int index = 0;

        DSP dsp =dsr.getDSP();
        dsp.getDsp3_DataLine().setValue("result="+doc.getRootElement().elementTextTrim("result")+","+"result_text="+doc.getRootElement().elementTextTrim("result_text"));

        System.out.println(dsr);

        HapiContext hapiContext =new DefaultHapiContext();
        PipeParser pipeParser =hapiContext.getPipeParser();
        String res=pipeParser.encode(dsr);
        DSR_Q01 dsr_q01= (DSR_Q01) pipeParser.parse(res);

        DSP dsp1 =dsr_q01.getDSP();


        dsp1.getDsp3_DataLine().getValue();




        System.out.println(dsr_q01);
    }

    /**
     * 细菌和常规检验报告单入报文
     */
    @Test
    public void testXjcgR() throws Exception{
        ORU_R01 oru = new ORU_R01();
        //QBP_Q13 qbp = new QBP_Q13();
        oru.initQuickstart("ORU_R01", "ORU_R01", "P");
        MSH msh = oru.getMSH();
        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("SSM");
        msh.getMsh10_MessageControlID().setValue(IdGenerator.getUUID());
        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("10270");

        ORU_R01_PATIENT_RESULT oru_r01 =oru.getPATIENT_RESULT();


        ORU_R01_ORDER_OBSERVATION oru_r01_order_observation= oru_r01.getORDER_OBSERVATION();
        OBR obr = oru_r01_order_observation.getOBR();
        obr.getSpecimenSource().getSps1_SpecimenSourceNameOrCode().getCe1_Identifier().setValue("testNo="+"100010010001001");

            int index=0;
            ORU_R01_OBSERVATION oru_r01_observation=oru_r01_order_observation.getOBSERVATION(index++);
            OBX obx = oru_r01_observation.getOBX();
            obx.getObx3_ObservationIdentifier().getCe1_Identifier().setValue("itemNo="+"101");
            obx.getObx3_ObservationIdentifier().getCe2_Text().setValue("printOrder="+"1");
            obx.getObx9_Probability(0).setValue("reportItemName="+"项目名称1");
            obx.getObx9_Probability(1).setValue("reportItemCode="+"4018");
            obx.getObx10_NatureOfAbnormalTest().setValue("reportItemName2="+"项目名称2");
            obx.getObx11_ObservationResultStatus().setValue("reportItemCode2="+"4010");
            obx.getObx2_ValueType().setValue("result="+"结果");
            obx.getObx6_Units().getCe2_Text().setValue("units="+"次");
            obx.getObx11_ObservationResultStatus().setValue("abnormalIndicator="+"H");
            obx.getObx18_EquipmentInstanceIdentifier(0).getEi1_EntityIdentifier().setValue("instrumenId="+"12");
            obx.getObx8_AbnormalFlags().setValue("send_time="+"2018-10-10 20:17:17");
            obx.getObx16_ResponsibleObserver().getXcn10_NameTypeCode().setValue("verified_time="+"2018-10-10 20:27:37");
            obx.getObx14_DateTimeOfTheObservation().getTs1_TimeOfAnEvent().setValue("result_date_time="+"2018-10-10 20:17:17");
            obx.getObx15_ProducerSID().getCe2_Text().setValue("result_doctor="+"xiao");
            obx.getObx13_UserDefinedAccessChecks().setValue("lower_limit"+","+"upper_limit");
            obx.getObx7_ReferencesRange().setValue("ref_range="+"ref_range");
            obx.getObx16_ResponsibleObserver().getXcn2_FamilyName().getFn1_Surname().setValue("result_method"+"result_method");
            obx.getObx16_ResponsibleObserver().getXcn2_FamilyName().getFn2_OwnSurnamePrefix().setValue("drug_sensitivity_name"+"drug_sensitivity_name");
            obx.getObx16_ResponsibleObserver().getXcn2_FamilyName().getFn3_OwnSurname().setValue("quantitative_result"+"quantitative_result");
            obx.getObx16_ResponsibleObserver().getXcn2_FamilyName().getFn4_SurnamePrefixFromPartnerSpouse().setValue("qualitative_result"+"qualitative_result");
            obx.getObx16_ResponsibleObserver().getXcn2_FamilyName().getFn5_SurnameFromPartnerSpouse().setValue("memo"+"memo");

       System.out.println(oru);

       /* HapiContext hapiContext =new DefaultHapiContext();
        PipeParser pipeParser =hapiContext.getPipeParser();
        String res=pipeParser.encode(oru);
        ORU_R01 oru_r011= (ORU_R01) pipeParser.parse(res);
        //QBP_Q13 qbp_q131 = (QBP_Q13) pipeParser.parse(res);
        RCP rcp1 =qbp_q131.getRCP();
        rcp1.getRcp6_SortByField(0).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(1).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(2).getSrt1_SortByField().getValue();
        rcp1.getRcp6_SortByField(3).getSrt1_SortByField().getValue();

        System.out.println(qbp_q131);*/
    }

    /**
     * 细菌和常规检验报告单出报文
     */
    @Test
    public void testXjcgC() throws Exception{
        String message = "<?xml version=\"1.0\"?>\n" +
                "<Request>\n" +
                "\t<TradeCode>10270</TradeCode>\n" +
                "\t<TransNO>APPa7f2373a118e479b93ce514fdb0ebd1b</TransNO>\n" +
                "\t<TerminalCode>APP</TerminalCode>\n" +
                "\t<MachineIP>0.0.0.0</MachineIP>\n" +
                "\t<result>0</result>\n" +
                "\t<result_text>正常</result_text>\n" +
                "</Request>";
//        Assert.notNull(message,"message 为空.");
//        Document doc = ProxyMsgTemplate.getOutMsgTpl(message);
//        RDY_K15 rdy=new RDY_K15();
//        //DSR_Q01 dsr = new DSR_Q01();
//
//        rdy.initQuickstart("RDY_K15", "K15", "P");
//        MSH msh = rdy.getMSH();
//        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("HIS");
//        msh.getMsh5_ReceivingApplication().getHd1_NamespaceID().setValue("LIS");
//        msh.getMsh7_DateTimeOfMessage().getTs1_TimeOfAnEvent().setValue(new Date());
//        msh.getMsh10_MessageControlID().setValue(UUID.randomUUID().toString().replace("-",""));
//        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("10270");
//        msh.getMsh11_ProcessingID().getPt2_ProcessingMode().setValue("P");
//
//        int index = 0;
//
//        DSP dsp =rdy.getDSP();
//        dsp.getDsp3_DataLine().setValue("result="+doc.getRootElement().elementTextTrim("result")+","+"result_text="+doc.getRootElement().elementTextTrim("result_text"));
//
//        System.out.println(rdy);
//
//        HapiContext hapiContext =new DefaultHapiContext();
//        PipeParser pipeParser =hapiContext.getPipeParser();
//        String res=pipeParser.encode(rdy);
//        RDY_K15 rdy_k15= (RDY_K15) pipeParser.parse(res);
//        //DSR_Q01 dsr_q01= (DSR_Q01) pipeParser.parse(res);
//
//        DSP dsp1 =rdy_k15.getDSP();
//
//
//        dsp1.getDsp3_DataLine().getValue();
//
//
//        System.out.println(rdy_k15);


        String message1 = "<?xml version=\"1.0\"?>\n" +
                "<Request>\n" +
                "\t<MPrice>100</MPrice>\n" +
                "\t<MCharges>100</MCharges>\n" +
                "\t<MExecStat>00</MExecStat>\n" +
                "</Request>";



        //检验申请单计费/退费 应答消息字段
        Assert.notNull(message1,"message 为空.");
        Document doc = ProxyMsgTemplate.getOutMsgTpl(message1);
        QBP_Q13 qbp_q13 = new QBP_Q13();
        qbp_q13.initQuickstart("QBP_Q13", "Q13", "P");
        MSH msh = qbp_q13.getMSH();
        msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("HIS");
        msh.getMsh5_ReceivingApplication().getHd1_NamespaceID().setValue("LAB");
        msh.getMsh7_DateTimeOfMessage().getTs1_TimeOfAnEvent().setValue(new Date());
        msh.getMsh10_MessageControlID().setValue(UUID.randomUUID().toString().replace("-",""));
        msh.getMsh11_ProcessingID().getPt1_ProcessingID().setValue("300040");
        msh.getMsh11_ProcessingID().getPt2_ProcessingMode().setValue("P");

        int index = 0;

        RCP rcp = qbp_q13.getRCP();
        rcp.getRcp6_SortByField(0).getSrt1_SortByField().setValue("MPrice="+doc.getRootElement().elementTextTrim("MPrice"));
        rcp.getRcp6_SortByField(1).getSrt1_SortByField().setValue("MCharges="+doc.getRootElement().elementTextTrim("MCharges"));
        rcp.getRcp6_SortByField(2).getSrt1_SortByField().setValue("MExecStat="+doc.getRootElement().elementTextTrim("MExecStat"));


        System.out.println(qbp_q13);


    }
}